import com.DButils.DBUtils;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.*;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;

public class DBUtilTest {
    public static void main(String[] args) throws Exception {
        DBUtils dbUtils = new DBUtils();
        QueryRunner queryRunner = new QueryRunner(getDataSource());


        /*
          ResultSetHandler接口的实现类
         */
        String select = "select * from books";
//        new Book().getClass();
        // ArrayHandler --> 第一行数据 --> Object 数组中
//        Object[] query = queryRunner.query(select, new ArrayHandler());
//        System.out.println(Arrays.toString(query));
        // ArrayListHandler --> 每一行数据 --> Object 数组中，最后放到 List 集合中
//        List<Object[]> query = queryRunner.query(select, new ArrayListHandler());
//        query.forEach(objects -> {
//            System.out.println(Arrays.toString(objects));
//        });
        // BeanHandler --> 第一行数据 --> 对象
//        Book book = queryRunner.query(select, new BeanHandler<>(Book.class));
//        System.out.println(book);
        // BeanListHandler --> 每一行数据 --> 对象 将对象放到 List 集合中
//        List<Book> books = queryRunner.query(select, new BeanListHandler<>(Book.class));
//        books.forEach(System.out::println);
        // ColumnListHandler --> 将某一列取出来放到 List 集合中
//        List<Object> query = queryRunner.query(select, new ColumnListHandler<>(2));
//        query.forEach(System.out::println);
        // MapHandler --> 将第一行数据 列名当做 key 列内容 当做value 放到 Map 集合中
//        Map<String, Object> query = queryRunner.query(select, new MapHandler());
//        query.forEach((k,v) ->{
//            System.out.println(k + "==>" + v);
//        });
        // MapListHandler 将每一行的数据 列名当 key 列内容 当 value 放到 Map 集合中，最后放到 List 集合中
//        List<Map<String, Object>> query = queryRunner.query(select, new MapListHandler());
//        query.forEach(obj ->{
//            obj.forEach((k,v) ->{
//                System.out.println(k + "=>" + v);
//            });
//        });
        // KeyedHandler 每一行的数据 列名 作为 key  列内容作为value 封装成 Map1对象 在将结果放到新的Map对象，key是执行的列的值 value就是Map1对象
//        Map<String, Map<String, Object>> query = queryRunner.query(select, new KeyedHandler<String>("book_title"));
//        query.forEach((k,v) ->{
//            System.out.println(k + "=>" + v);
//        });
        // ScalarHandler 查询只有一行一列的结果 用这个实现类
//        String sql = "select book_title from books where id = ?";
//        Object query = queryRunner.query(sql, new ScalarHandler<>(),5);
//        System.out.println(query);
    }

    private static DataSource getDataSource() throws Exception {
        Properties properties = new Properties();
        properties.load(new FileInputStream("JDBC/JDBC9.28/io/druid.properties"));
        return DruidDataSourceFactory.createDataSource(properties);
    }
}
